Configurar Docker en WSL para desplegar imagenes

Descripcion

Como configurar Docker cuando está instalado en WSL para poder desplegar imagenes directamente con maven y spring-boot.

Metodo

Si tenemos instalado el Docker Desktop en principio no tendríamos ningun problema al intentar generar una imagen en docker directamente usando maven y spring-boot, pero si en vez de tener docker desktop tenemos instalado docker en una distribución de WSL al intentar generar una imagen obtendremos el siguiente error:

[INFO] I/O exception (java.nio.file.NoSuchFileException) caught when processing request to {}->docker://localhost:2376: \\.\pipe\docker_engine
[INFO] Retrying request to {}->docker://localhost:2376

El error se produce porque Docker al instalarlo sobre WSL por defecto solo escucha en un socket local, unix:///var/run/docker.sock

Para solucionar el error tenemos que configurar el servicio de docker para que al levantarse se ponga a escuchar en un puerto tcp

Primero paramos el servicio de docker en nuestra distribucion de WSL con el siguiente comando:

sudo service docker stop

A continuación tenemos que editar el archivo /etc/init.d/docker

concretamente tenemos que editar la variable DOCKER_OPTS para incluir el siguiente contenido:

"-H unix:///var/run/docker.sock -H tcp://localhost:2376"

El contenido quedaría tal que así:

NOTA: en este caso estamos indicando el puerto 2376 si la aplicación que se conecta a docker lo hace por otro puerto pues tendríamos que poner ese puerto concretamente.

Una vez hecho esto solo tenemos que levantar el servicio

sudo service docker start

Ahora en nuestro sistema anfitrion (NO DENTRO DEL WSL) tenemos que declarar la variable de sistema DOCKER_HOST y darle el valor tcp://localhost:2376

Esto podemos hacerlo de varias maneras y depende del terminal que usemos tambien.

Si lo hacemos desde las variables de entorno (con la interfaz grafica de windows) tendremos que cerrar todas las terminales del VScode y reiniciar el IDE para que las terminales cojan el valor de la variable

Si lo queremos hacer directamente desde el terminal depende de si es un terminal tipo unix, cmd o PowerShell

Unix:

export DOCKER_HOST=tcp://localhost:2376

cmd:

set DOCKER_HOST=tcp://localhost:2376

PowerShell:

$env:DOCKER_HOST = 'tcp://localhost:2376'

Despues solo tenemos que ejecutar el comando para generar la imagen desde la consola:

mvn spring-boot:build-image

NOTA: cuidado porque si se ejecuta el goal para generar la imagen desde el IDE el propio IDE te puede abrir una nueva consola que no tenga definida la variable y no funcionará el comando.

El comando ya debería de encontrar la instancía de docker y conectarse para generar la imagen:

Tags

Docker Engine | Spring | WSL | deploy